package com.fulihui.usercore.api;

import com.fulihui.usercore.condition.UserCondition;
import com.fulihui.usercore.dto.AuthDTO;
import com.fulihui.usercore.dto.UserDTO;
import com.fulihui.usercore.dto.UserStatusDTO;
import com.fulihui.usercore.dto.WechatUserDTO;
import com.fulihui.usercore.request.user.*;

import org.near.servicesupport.request.BaseRequest;
import org.near.servicesupport.request.TPageRequest;
import org.near.servicesupport.request.TRequest;
import org.near.servicesupport.result.BaseResult;
import org.near.servicesupport.result.TMultiResult;
import org.near.servicesupport.result.TPageResult;
import org.near.servicesupport.result.TSingleResult;

import java.util.List;
import java.util.Map;

/**
 * 用户信息操作接口
 * Created by Willard.Hu on 2016/5/16.
 */
public interface UserService {

    /**
     * 用户注册
     * <p>将用户注册拆成多个服务，注册模型可以清晰了</p>
     *
     * @param request {@link UserRegisterRequest}
     * @return {@link AuthDTO}
     */
    @Deprecated
    TSingleResult<AuthDTO> register(UserRegisterRequest request);

    /**
     * 判断用户是否已经注册
     *
     * @param request {@link UserCheckRegisteredRequest}
     * @return true 已注册、false 未注册
     */
    @Deprecated
    TSingleResult<Boolean> checkRegistered(UserCheckRegisteredRequest request);

    /**
     * 用户登录
     * <p>将用户注册拆成多个服务，注册模型可以清晰了</p>
     *
     * @param request {@link UserLoginRequest}
     * @return {@link AuthDTO}
     */
    @Deprecated
    TSingleResult<AuthDTO> login(UserLoginRequest request);

    /**
     * (分表分库，无需修改)
     * 用户信息修改
     *
     * @param request {@link UserModifyRequest}
     * @return 返回接口调用结果 {@link BaseResult}
     */
    BaseResult modify(UserModifyRequest request);

    /**
     * (分表分库，无需修改)
     * 修改用户密码
     *
     * @param request {@link UserModifyPasswdRequest}
     * @return 返回接口调用结果 {@link BaseResult}
     */
    BaseResult modifyPasswd(UserModifyPasswdRequest request);

    /**
     * (分表分库) 已修改
     * 用户忘记密码处理
     *
     * @param request {@link UserForgetPasswdRequest}
     * @return 返回接口调用结果 {@link BaseResult}
     */
    BaseResult forgetPasswd(UserForgetPasswdRequest request);

    /**
     * (分表分库，无需修改)
     * 判断用户是否有密码
     *
     * @param request userid
     * @return true 有密码 false 没有密码
     */
    TSingleResult<Boolean> hasPasswd(UserIdRequest request);

    /**
     * (分表分库，无需修改)此方法为 修改usr_user表的手机号
     * 认证（修改）手机号
     *
     * @param request {@link UserModifyMobileNoRequest}
     * @return 返回接口调用结果 {@link BaseResult}
     */
    BaseResult modifyMobileNo(UserModifyMobileNoRequest request);

    /**
     * (分表分库，无需修改)
     * 认证（修改）身份证
     *
     * @param request {@link UserModifyIdcardRequest}
     * @return 返回接口调用结果 {@link BaseResult}
     */
    BaseResult modifyIdcard(UserModifyIdcardRequest request);

    /**
     * (分表分库，无需修改)
     * 认证（修改）邮箱
     *
     * @param request {@link UserModifyEmailRequest}
     * @return 返回接口调用结果 {@link BaseResult}
     */
    BaseResult modifyEmail(UserModifyEmailRequest request);

    /**
     * (分表分库，无需修改)
     * 添加用户身份
     *
     * @param request {@link UserAppendIdentityRequest}
     * @return 返回接口调用结果 {@link BaseResult}
     */
    BaseResult appendIdentity(UserAppendIdentityRequest request);

    /**
     * (分表分库，无需修改)
     * 移除用户身份
     *
     * @param request {@link UserRemoveIdentityRequest}
     * @return 返回接口调用结果 {@link BaseResult}
     */
    BaseResult removeIdentity(UserRemoveIdentityRequest request);

    /**
     * (分表分库) 已改
     * 查询单个用户
     *
     * @param request {@link UserSingleRequest}
     * @return 返回单个用户信息 {@link UserDTO}
     */
    TSingleResult<UserDTO> querySingle(UserSingleRequest request);

    /**
     * (分表分库，无需修改)
     * 通过用户唯一标识集合查询用户集合
     *
     * @param request 用户唯一标识集合
     * @return 返回多个用户信息 {@link UserDTO}
     */
    // FIXME 修改请求参数，给依赖系统足够的时间修改
    TMultiResult<UserDTO> queryByUserIds(TRequest<List<String>> request);

    /**
     * (分表分库，无需修改)
     * 通过用户唯一标识集合查询用户字典，key-userid,value-userDTO
     *
     * @param request 用户唯一标识集合
     * @return 返回多个用户信息 {@link UserDTO}
     */
    // FIXME 修改请求参数，给依赖系统足够的时间修改
    TSingleResult<Map<String, UserDTO>> queryByUserIdsToMap(TRequest<List<String>> request);

    /**
     *
     * 分页查询用户
     *
     * @param request {@link UserCondition}
     * @return 分页的用户信息 {@link UserDTO} , {@link TPageResult}
     */
    TPageResult<UserDTO> queryPage(TPageRequest<UserCondition> request);

    /**
     * 统计用户
     *
     * @param request {@link UserCondition}
     * @return 查询的用户数
     */
    TSingleResult<Long> countUser(TRequest<UserCondition> request);

    /**
     * 统计用户所有信息
     *
     * @return 用户数
     */
    TSingleResult<Long> countAll();

    /**
     * (分表分库)已完成
     * 获取用户微信信息
     *
     * @param request {@link UserWechatSingleRequest}
     * @return 返回单个微信用户信息 {@link WechatUserDTO}
     */
    TSingleResult<WechatUserDTO> queryWechatUserInfo(UserWechatSingleRequest request);

    /**
     * (分表分库,无需修改)
     * token兑换用户唯一标识，向下兼容
     *
     * @param request token
     * @return userId
     */
    @Deprecated
    TSingleResult<String> exchangeUserIdByToken(TRequest<String> request);

    /**
     * (分表分库,无需修改)
     * token兑换用户唯一标识
     *
     * @param request {@link AuthTokenRequest}
     * @return userId
     */
    TSingleResult<String> exchangeUserIdByToken(AuthTokenRequest request);

    /**
     * (分表分库,无需修改)
     * 从 Redis 中删除 Token
     *
     * @param request {@link AuthTokenRequest}
     * @return {@link BaseResult} 操作结果
     */
    BaseResult removeToken(AuthTokenRequest request);

    /**
     * (分表分库)已完成
     * 微信openId与用户userId绑定关联，只有用户未绑定过时才可以绑定，否则会绑定失败，返回错误信息
     *
     * @param request {@link UserWechatSingleRequest}
     * @return 返回接口调用结果 {@link BaseResult}
     */
     BaseResult bindingWechat(BindingWechatRequest request);

    /**
     * 查询无效的微信信息
     *
     * @param request 基础查询参数 {@link BaseRequest}
     * @return {@link WechatUserDTO} 多个返回值
     */
    TMultiResult<WechatUserDTO> queryDsiabledWechatUser(BaseRequest request);

    /**
     * 设置微信用户数据是否作废
     *
     * @param request {@link UpdateWechatUserDisableRequest}
     * @return {@link BaseResult}
     */
    BaseResult updateWechatUserDisable(UpdateWechatUserDisableRequest request);

    /**
     * (分表分库)已完成
     * 登入账号批量获取用户唯一标识集合
     *
     * @param request 登入账号，最多不超过100个
     * @return 用户唯一标识集合
     */
    TSingleResult<Map<String, String>> queryUseridsByLoginIds(LoginIdsRequest request);

    /**
     * (分表分库)已完成
     * 修改用户状态
     *
     * @param request {@link UserModifyStateRequest}
     * @return {@link BaseResult}
     */
    BaseResult modifyState(UserModifyStateRequest request);

    /**
     * (分表分库)已完成
     * 根据登录手机号判断是否设置过密码
     * @param request
     * @return
     */
    TSingleResult<Boolean> hasPasswdByLoginId(LoginIdRequest request);
    /**
     * (分表分库)已完成
     * 设置用户密码
     *
     * @param request {@link UserSetPasswdRequest}
     * @return 返回接口调用结果 {@link BaseResult}
     */
    BaseResult setPasswd(UserSetPasswdRequest request);

    /**
     * (分表分库)已完成
     * 根据登录手机号，检测用户是否注册过，如注册过 检测用户是否设置过密码
     * @param request
     * @return
     */
    TSingleResult<UserStatusDTO> checkUserStatus(UserCheckStatusRequest request);

    /**
     * (分表分库)无需修改
     * 检测密码是否为弱密码
     * @param request
     * @return
     */
    BaseResult checkWeakPassword(WeakPasswordCheckRequest request);

    /**
     * (分表分库)已完成  重点测试
     * 用户完善手机号接口
     * @param request
     * @return
     */
    BaseResult completeMobile(UserLoginMobileRequest request);
}
